#include <stdio.h>

void main()
{
    // 1、取反运算符～
    // 取反运算符～是一个一元运算符，用来将每一个二进制位变成相反值
    int a = 10;
    printf("~a is %i\n", ~a);

    // 2、与运算符&
    //   与运算符&将两个值的每一个二进制位进行比较，返回一个新的值。当两个二进制位都为1，就返回1，否则返回0。
    printf("0&1 is %i\n", 0 & 1);

    // 3、或运算符|
    // 或运算符|将两个值的每一个二进制位进行比较，返回一个新的值。两个二进制位只要有一个为1（包含两个都为1的情况），就返回1，否则返回0。
    printf("0|1 is %i\n", 0 | 1);

    // 4、异或运算符^
    // 异或运算符^将两个值的每一个二进制位进行比较，返回一个新的值。两个二进制位有且仅有一个为1，就返回1，否则返回0
    printf("0 ^ 1 is %i\n", 0 ^ 1);

    // 5、左移运算符<<
    // 左移运算符<<将左侧运算数的每一位，向左移动指定的位数，尾部空出来的位置使用0填充
    // 左移运算符相当于将运算数乘以2的指定次方
    printf("1 << 2 is %i\n", 1 << 2);

    // 6、右移运算符>>
    // 右移运算符>>将左侧运算数的每一位，向右移动指定的位数，尾部无法容纳的值将丢弃，头部空出来的位置使用0填充。
    printf("2 >> 1 is %i\n", 2 >> 1);
}